<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
        // 1. 以前我们创建对象，一次只能创建一个对象， 如果需要多个对象，就存在大量代码重复浪费的现象
        var ldh = {
            name: '刘德华',
            age: 18,
            sex: '男',
            sing: function() {
                console.log('冰雨');

            }
        }
        var zxy = {
                name: '张学友',
                age: 19,
                sex: '男',
                sing: function() {
                    console.log('李兰香');

                }
            }
            // 2. 因为他们这些对象， 有很多相同的属性和方法 我们能不能封装一个函数？
            // 3. 我们可以自定义一个函数 来封装多个对象相同的属性和方法。 但是这个函数和以前我们讲的函数不太一样。 以前我们函数封装的是 普通代码，现在我们函数封装的是 对象。 所以，我们这个函数为了显示与众不同，我们成为 构造函数。  == 构造函数里面封装的是 对象。
            // 4. 自定义构造函数 语法规范
            // function 构造函数名(参数1,...) {  构造函数名的首字母要大写
            //     this.属性名 = 属性值;    // this 当前的意思  因为我们对象有很多，this就是当前传递过的那个对象
            //     this.方法名 = funciton() {}
            // }
            // 调用构造函数  new 构造函数名();
            // 5. 代码演示
        function Stars(name, age, sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.sing = function() {
                console.log('唱歌');

            }
        }
        // 使用构造函数  调用构造函数 我们需要 使用 new   
        var ldh = new Stars('刘德华', 18, '男');
        console.log(ldh.name);
        console.log(ldh.age);
        console.log(ldh.sex);
        ldh.sing();
        var zxy = new Stars('张学友', 19, '男');
        console.log(zxy.name);
        console.log(zxy.age);
        console.log(zxy.sex);
        zxy.sing();
    </script>
</head>

<body>

</body>

</html>